﻿// ==UserScript==
// @name ISP_ssh v2
// @description Add many links to client products in support tickets
// @author yumaa@ispsystem.com
// @include https://my.ispsystem.com/manager/*
// ==/UserScript==

// скрытие и показ меню
function ujsMenu() {
	var topel = $id('ujspassmenu');
	var topelmenu = $id('ujspasssubmenu');
	if ( topel && topelmenu ) {
		var topelimg = topel.getElementsByTagName('IMG')[0];
		if ( 'sel' == topelmenu.className ) {
			topelimg.className = topelimg.className.replace(/ sel/, '');
			topelmenu.className = '';
		} else {
			topelimg.className += ' sel';
			topelmenu.className = 'sel';
		}
	}
}

// скопипащенная mn_md_ftitle применительно к моей форме
function ujsMoveForm(e) {
	if (!e) var e = window.event;
	var felem = $id('ujsRejTbl');
	if ( !felem ) return;
	var pos = mn_get_obj_pos(felem);
	document.body.style.cursor = 'move';
	mn_form_move = {
		obj: felem,
		x: (e.clientX - pos[0]),
		y: (e.clientY - pos[1]),
		w: felem.offsetWidth,
		h: felem.offsetHeight
	};
	document.onmouseup   = mn_mu_doc;
	if (document.captureEvents) document.captureEvents(Event.MOUSEUP);
	document.onmousemove = mn_mm_doc;
	if (document.captureEvents) document.captureEvents(Event.MOUSEMOVE);
	formframe.fr_reg_mm('move');
	mn_stop_event ( e );
}

// создание элемента script для загрузки данных в json формате. необходима callback функция
function ujsGetJSONdata(url, el, loadingstr) {
	if (el) el.innerHTML = loadingstr;
	var headID = $tag("head")[0];
	var newScript = document.createElement('script');
	newScript.type = 'text/javascript';
	newScript.src = url;
	headID.appendChild(newScript);
}

// вывод результата запроса к api vdsmanager'а
function ujsRejJSONcallback(obj) {
	if ( !obj.elem ) return;
	
	if ( typeof ujsRejJSONcallback.elem == 'undefined' )
		ujsRejJSONcallback.elem = obj.elem
	else
		ujsRejJSONcallback.elem = obj.elem.concat(ujsRejJSONcallback.elem);
	
	if ( typeof ujsRejJSONcallback.pass == 'undefined' )
		ujsRejJSONcallback.pass = 0
	else
		ujsRejJSONcallback.pass = 1;
	
	var elem = ujsRejJSONcallback.elem;
	var col = 10;
	
	// если получили меньше строк, чем col - запрашиваем предыдущий месяц
	if ( !ujsRejJSONcallback.pass && elem.length < col ) {
		// запрашиваем информацию от vdsmanager'а, в json формате
		ujsGetJSONdata(
			ujsGetRejURL().json.replace(/%d/,ujsGetM(1))
		);
		return;
	}
	
	clearTimeout(UJ$.rejTimeout);
	
	// всё получили - рисуем табличку с отказами
	var reshtml = '<table><tr><th>Дата</th>\
							  <th>Запуск процессов</th>\
							  <th>Файловые дескрипторы</th>\
							  <th>Выделение памяти</th>\
							  <th>Выделение swap</th></tr>';
	for ( i = (elem.length-col<0)?0:elem.length-col; i < elem.length; i++) {
		reshtml += '<tr><td>'+elem[i].name+'</td>\
						<td>'+elem[i].rejp+'</td>\
						<td>'+elem[i].rejf+'</td>\
						<td>'+elem[i].rejm+'</td>\
						<td>'+elem[i].rejs+'</td></tr>';
	}
	reshtml += '</table>';
	ujsShowForm().getElementsByClassName('ujsRejSubdiv')[0].innerHTML = reshtml;
	
	// сбрасываем статические переменные
	delete ujsRejJSONcallback.elem;
	delete ujsRejJSONcallback.pass;
}

// получить url api vdsmanager'а для отказов в ресурсах
// если вызывается без параметров - возвращает прошлый url
function ujsGetRejURL(vds,ip) {
	if ( !vds || !ip )
		if ( typeof ujsGetRejURL.url != 'undefined' )
			return ujsGetRejURL.url;
	
	// логин/пароль на VDSmanager'ы
	var vdsmgrpass = ujsGetCookie('ujsvdsmgr').split(' ');
	var vdsmgrlogin = vdsmgrpass[0];
	vdsmgrpass = vdsmgrpass[1] || '';
	
	// урл для получения отказов в ресурсах
	var urldunno = 'https://'+vds+'/manager/vdsmgr?authinfo='+vdsmgrlogin+':'+vdsmgrpass+'&su='+ip+'&func=statrejects&elid=%d&out=';
	
	if ( typeof ujsGetRejURL.url == 'undefined' )
		ujsGetRejURL.url = {};
	ujsGetRejURL.url.text = urldunno + 'text';
	ujsGetRejURL.url.json = urldunno + 'json&callback=ujsRejJSONcallback';
	return ujsGetRejURL.url;
}

// показывание формы с отказами в ресурсах
function ujsRej(vds,ip) {
	// табличка loading
	var tableload = '<table border=0 width=100% height=100%><tr align=center><td valign=middle><img src="%i"><br><br><a onclick="ujsDoPost(\'%u\'); return false;" href="#" target=_blank>api link</a></td></tr></table>';
	var imgloading = 'http://i.i.ua/photo/images/pic/5/2/1283725_65f6a540.gif';
	var imgerror = 'http://i.i.ua/photo/images/pic/9/7/1283779_1414acf6.gif';
	//var imgloading = '/manimg/sirius/waiting.gif';
	
	// запрашиваем информацию от vdsmanager'а, в json формате
	ujsGetJSONdata(
		ujsGetRejURL(vds,ip).json.replace(/%d/,ujsGetM()),
		ujsShowForm().getElementsByClassName('ujsRejSubdiv')[0],
		tableload.replace('%i',imgloading).replace('%u',ujsGetRejURL().text.replace(/%d/,ujsGetM()))
	);
	
	// 10 секунд на запрос, иначе показывается ошибка
	clearTimeout(UJ$.rejTimeout);
	UJ$.rejTimeout = setTimeout(function() {
		var inel = ujsShowForm().getElementsByClassName('ujsRejSubdiv')[0];
		inel.innerHTML = tableload.replace('%i',imgerror).replace('%u',ujsGetRejURL().text.replace(/%d/,ujsGetM()));
	}, 10000);
	
	return false;
}

// открытие формы
function ujsShowForm() {
	var prdoc = window.parent.parent.document;
	var rejdiv = prdoc.getElementById('ujsRejdiv');
	if ( !rejdiv ) { // вызвали первый раз, создаем формочку
		rejdiv = document.createElement('DIV');
		rejdiv.id = 'ujsRejdiv';
		rejdiv.innerHTML = '<table cellspacing="0" id="ujsRejTbl"><tr><td><table cellspacing="0"><tr><td unselectable="on"><table cellspacing="0" width="100%"><tr><td class="ft-td1"><img width="8" height="30" src="ft-left.png"/></td><td class="ft-td2" onmousedown="ujsMoveForm(event)"><div id="ftitle" class="ftitle" unselectable="on">Отказы в ресурсах</div></td><td class="ft-td5"><img width="16" height="16" class="f-sysbar-img" onclick="ujsCloseForm()" src="fi-close.png"/></td><td class="ft-td6"><img width="8" height="30" src="ft-right.png"/></td></tr></table></td></tr><tr><td class="formlayer-table-content"><div class="ujsRejSubdiv"></div></td></tr></table></td><td style="background: url(\'fsh-left.png\');" valign="top"><img src="e.gif" height="1" width="6"/></td></tr><tr><td colspan="2"><table cellspacing="0" width="100%"><tr><td><img src="e.gif" height="8" width="6"/></td><td style="background: url(\'fsh-bottom.png\')" width="99%"><img src="e.gif" height="8" width="6"/></td></tr></table></td></tr></table>';
		prdoc.body.appendChild(rejdiv);
	} else // форма есть уже, показываем
		rejdiv.style.display = 'block';
	return rejdiv;
}

// закрытие формы
function ujsCloseForm() {
	clearTimeout(UJ$.rejTimeout);
	var rejdiv = $id('ujsRejdiv');
	rejdiv.style.display = 'none';
}

// динамическая кнопочка, требующая запроса куда бы то ни было
// в ссылке lnk заменяется %s на то, что вернет запрос rlnk, и данная ссылка подставляется в href кнопки
function createDynamicButton(id, lnk, rlnk, srcb/*before*/, srca/*after*/) {
	var a = document.createElement('A');
	a.setAttribute('href', '');
	a.setAttribute('onclick', 'return false;');
	a.id = id;
	var img = document.createElement("IMG");
	img.setAttribute("src", srcb);
	a.appendChild(img);
	
	// делаем ajax запрос
	var xmlhttp = new opera.XMLHttpRequest();
	//xmlhttp.onreadystatechange = function() { alert(this.readyState); }
	xmlhttp.onload = function() {
		if (200 == this.status) {
			var a = $id(id);
			if ( a )
				var img = a.getElementsByTagName('IMG')[0];
			else return;
			a.setAttribute('href', lnk.replace(/%s/, this.responseText));
			a.setAttribute('onclick', '');
			a.setAttribute('target', '_blank');
			img.setAttribute("src", srca);
		} else return;
	}
	xmlhttp.open('GET',rlnk,true);
	xmlhttp.send('');
	
	return a.outerHTML;
}

// обработка нажатий на пункты меню
function ujsMenuClick(el) {
	if ( el.innerText.match(/My BILLmanager name/) ) {
		var myname = ujsGetCookie('ujsmyname'); // мое имя в биллинге (для подсветки залоченных тикетов)
		ujsPrompt('Введите ваше имя в BILLmanager (для подсветки залоченных тикетов)', myname, 'ujsmyname');
	} else
	if ( el.innerText.match(/My SSH login/) ) {
		var vdsssh = ujsGetCookie('ujsssh'); // ssh логин на vds сервера
		ujsPrompt('Введите ваш SSH логин на VDSные сервера', vdsssh, 'ujsssh');
	} else
	if ( el.innerText.match(/VDSmanager/) ) {
		var vdsmgrpass = ujsGetCookie('ujsvdsmgr').split(' '); // логин/пароль на VDSmanager'ы
		var vdsmgrlogin = vdsmgrpass[0];
		vdsmgrpass = vdsmgrpass[1] || '';
		ujsPrompt('Введите логин/пароль на VDSmanager (через пробел)', vdsmgrlogin+' '+vdsmgrpass, 'ujsvdsmgr');
	} else
	if ( el.innerText.match(/ISPserver DS/) ) {
		var dsmgrpass = ujsGetCookie('ujsdsmgr').split(' '); // логин/пароль на дедики ISPserver'а
		var dsmgrlogin = dsmgrpass[0];
		dsmgrpass = dsmgrpass[1] || '';
		ujsPrompt('Введите логин/пароль на дедики ISPserver (через пробел)', dsmgrlogin+' '+dsmgrpass, 'ujsdsmgr');
	} else
	if ( el.innerText.match(/Knopp BILLmanager/) ) {
		var knopppass = ujsGetCookie('ujsknopp').split(' '); // логин/пароль в биллинг кноппа
		var knopplogin = knopppass[0];
		knopppass = knopppass[1] || '';
		ujsPrompt('Введите логин/пароль в биллинг Кноппа (через пробел)', knopplogin+' '+knopppass, 'ujsknopp');
	}
	ujsMenu();
}

(function() {
if (window.location.hostname != 'my.ispsystem.com') return; // фикс бага оперы про @include

	// ssh логин на vds сервера
	var vdsssh = ujsGetCookie('ujsssh');
	if ( vdsssh.replace(/\s*/,'') != '' ) vdsssh += '@'; else vdsssh = '';
	
	// логин/пароль на VDSmanager'ы
	var vdsmgrpass = ujsGetCookie('ujsvdsmgr').split(' ');
	var vdsmgrlogin = vdsmgrpass[0];
	vdsmgrpass = vdsmgrpass[1] || '';
	
	// логин/пароль на дедики ISPserver'а
	var dsmgrpass = ujsGetCookie('ujsdsmgr').split(' ');
	var dsmgrlogin = dsmgrpass[0];
	dsmgrpass = dsmgrpass[1] || '';
	
	// логин/пароль в биллинг кноппа
	var knopppass = ujsGetCookie('ujsknopp').split(' ');
	var knopplogin = knopppass[0];
	knopppass = knopppass[1] || '';
	
	// ссылки на разные панели и псевдопротоколы
	var ispmgr_plain = 'https://%s/manager/ispmgr';
	var vdsmgr_plain = 'https://%s/manager/vdsmgr';
	var dnsmgr_plain = 'https://%s/manager/dnsmgr';
	var dsmgr_plain = 'https://%s/manager/dsmgr';
	var ipmgr_plain = 'https://%s/manager/ipmgr';
	var billmgr_plain = 'https://%s/manager/billmgr';
	var vdsmgr = 'https://%s/manager/vdsmgr?func=auth&username='+vdsmgrlogin+'&password='+vdsmgrpass+'&checkcookie=no'; // зайти в VDSmanager админом
	var ispmgr = 'https://%s/manager/ispmgr?func=auth&username='+dsmgrlogin+'&password='+dsmgrpass+'&checkcookie=no'; // зайти в ISPmanager дедика
	var knoppbillmgr = 'https://my.radiushost.ru/manager/billmgr?func=auth&username='+knopplogin+'&password='+knopppass+'&checkcookie=no'; // зайти в биллинг кноппа
	var suvdsmgr = 'https://my.ispsystem.com/mancgi/goserver?elid=%i'; // зайти в VDSmanager VDS'а
	var suispmgr = 'https://my.ispsystem.com/mancgi/goserver?into=yes&elid=%i'; // зайти в ISPmanager VDS'а
	var ssh = 'ssh:%s'; // открыть ssh
	var clip = 'clip:%s'; // скопировать строку
	var vnc = 'vnc:%s'; // зайти на vnc
	
	// картинки кнопочек, закодированы в base64
	var imgopentag = '<img src="data:image/png;base64,';
	var plainimg = imgopentag+'iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAJHSURBVDjLlZPNi81hFMc/z7137p1mTCFvNZfGSzLIWNjZKRvFRoqNhRCSYm8xS3+AxRRZ2JAFJWJHSQqTQkbEzYwIM+6Yid/znJfH4prLXShOnb6r8/nWOd8Tcs78bz0/f+KMu50y05nK/wy+uHDylbutqS5extvGcxaWqtoGDA8PZ3dnrs2srQc2Zko41UXLmLdyDW5OfvsUkUgbYGbU63UAQggdmvMzFmzZCgTi7CQmkZwdEaX0JwDgTnGbTCaE0G4zw80omhPI92lcEtkNkdgJCCHwJX7mZvNaB0A14SaYJlwTrpHsTkoFlV1nt2c3x5YYo1/vM9A/gKpxdfwyu/v3teCayKq4JEwT5EB2R6WgYmrs2bYbcUNNUVfEhIfFYy69uci+1fuRX84mkawFSxd/4nVWUopUVIykwlQxRTJBTIDA4Pp1jBZPuNW4wUAPmCqWIn29X1k4f5Ku8g9mpKCkakRLVEs1auVuauVuyqHMo8ejNCe+sWPVTkQKXCMmkeZUmUZjETF1tc6ooly+fgUVw9So1/tRN6YnZji46QghBFKKuAouERNhMlbAHZFE6e7pB+He8MMw+GGI4xtOMf1+lsl3TQ4NHf19BSlaO1DB9BfMHdX0O0iqSgiBbJkjm491hClJbA1LxCURgpPzXwAHhg63necAIi3XngXLcRU0fof8ETMljIyM5LGxMcbHxzvy/6fuXdWgt6+PWncv1e4euqo1ZmabvHs5+jn8yzufO7hiiZmuNpNBM13rbvVSpbrXJE7/BMkHtU9jFIC/AAAAAElFTkSuQmCC" width="16" height="16" />';
	var sshimg = imgopentag+'iVBORw0KGgoAAAANSUhEUgAAABAAAAANCAIAAAAv2XlzAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAYdEVYdFNvZnR3YXJlAFBhaW50Lk5FVCB2My4zNqnn4iUAAAFhSURBVCjPjVJLbsIwFMSfOE6VhBXcgBU34AjcgE0lJK4BN0Biw0VyAjgFCw4AEqpQ48ZyQux0YtOqi0rt6MV6smbmzbNCrtfr+Xw2xgz+gpRyMpmQ4/GY53mWZda2bYvv8XigaZ1zXQcaI4SjOBfGaOc+eFVVTdPcbjfnYT1+bQIg5ev1ejQawa3rOm/chQbAOGMaSnsahi+Xrxy3YG82m8PhcLlcWp8poCxVWerhMEMelNYlTCnGwW+3281ms/F4bL5wv78rZaJIxvELSsokikQvCPutVquiKE6n02KxmE6nSlV1beM4+S4hIIgg4GGn/X6fpinE2+2WEGIth6tPAlp/MoYtvABZMSFJEsRAzxhzjgkhPa+ngkgpBJRS1gv6x7cW7LAu3l7KPGwZjFGYCWo4nxPqug5KIVIf5kkNrj/BtdawD2/vbyKl3gKVUuJdSaAao+DOset8Ph/8D/iDPgE0pw5BhQTL3QAAAABJRU5ErkJggg==" width="16" height="13" />';
	var sshvimg = imgopentag+'iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAfVJREFUeNqkU7+LE0EU/mZ2d3bDbkwukhQqwoUDuQRsTu+0VgsRKyGdYCEiWtgExCKNjZ3FlbES7x9IYaM21wgeHIggCMKKYCFCRLNJbn/Nrm9mcys2gmbgY17xvu99770Zluc5ljlmr9dr071FqP4jNyC8MaWU5/v9/oNWq9WVMkWaSkKCJFFxiizLUJg0wJipYZoC4/H4/XD4+JFJCUdms1nX932drECiGn+LCd3RaOSalmVlg8EAzWZT+1IzKarmZayQJAnCMAbnyoGpXeoZkE2myJ1Op6yirEdn1yB332niZBIQ5qjVqtq+wnw+KQW4qqRIh1Ck/MRRqhgScUrJMSzLIRRkck054W8BxhjiONbEQzgnWwiCGaJIwrYrC6JYOLAonmoBTslc2VbV0nOn9K2gDunA67RxfPs26lc2tZBtOxDC1iLaAVU2KpfOIN06jejjF3gPb5SL9tZXUb9zGd/vP0P11kW4F67hWGUFGyttPL1+rxTg7NU+Jm8/6yH+eP5a791dX0Pj7lUEwxdw3Trkzh7SPIPPAJ+Iqu3SgeM4um81QNWOEB7E1wjTJy/hfEtgUO+cG388w4ODYgYmPSJLCFHuvTgWDXAM48NPhETknC0qslIgDANaa81jjUbjJllf/Z+PxDn/xJb9jRxLnl8CDACftC2SN3RDawAAAABJRU5ErkJggg==" width="16" height="16" />';
	var suispimg = imgopentag+'iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAJUSURBVDjLpVPNaxNBFP8lqY1JSJOGFBtSU11BaEulUUFB7EUalB70kINCQfBv8FgNgvRUJCdPUj36FxgqKahpi18NSQXBikRbE6UfYpNtsruzO+ubTTaHNoLgwuMxs/P7eG/eOEzTxP98Xfs38vn8Y13XpxhjXZRB2QpN00R+mkwmb3QkKBaLAQI8CgaDSbfbC5VA4ByWP3LZ2xvE/HzmOq0OEhQKhcsCHA6Hoz6fD6WvZQh1zk1wkxORCYPIVFXtXAIdzsRiMWuj0VDACPyhuEIEvB0TiStWGR0JRI3d3d2oVqtNZcPA8MiYpW621EWz/+pAMBsEEofEpQjrxcI7yoalLv5FJq92dOAQoGw2a8bjcdRqNTrEUK5st9XtnNm+g7omQ+O698mt1YZN4LQdNJttWmEIZaNZ+5a/hLnfaSg6w0B4CApj9WsPj3kOlNAGt4DPNqdJmUH9weCjvvSFTmKo/xxqyh6K31/L47OhwKvbv2SLQDTHnkhhWfRA5xomRm7CoLXliCaisruB0YELkLWGc2X95e6p+85Q24G4BZfL1aybXCi6ZoG/7XwG4zoR0kQaDFW1hrGjFyGzuvNNaXHH2XLwNpfLQZZl+P1+HPa4iUCBbug40hNDf88gIgEJh1we9PmjyG8sYenL4lZdw1mHbT2dTk/SPNyLRCJnjksn8GB1Cgo506gU4UYKD+O8lMD79WUsrD3/qem4VJkxPzr2v8ZUKpUgolmKUfsxibwcncPpwXG8WFsoa9wCf2rPwb980l3HnsFd3gY3pM0Zs2Tv/wEq26vP9fcF2QAAAABJRU5ErkJggg==" width="16" height="16" />';
	var suvdsimg = imgopentag+'iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAIzSURBVDjLpVO7a1NRGP/dm9ubpGlMioGiLdFBHCyFtksHZ6tiQZAMEbqZwTGgkw7B3cmugoOL/0ATujadlIZchCwGWlERF5XbNOc+zsPvnNvUQmMWAx8f5+b8Ht/jWEop/M/POXvodDpvOOebcRw7lEHZRBRFOr+rVCoPxxJ4nlcgwOtisVhJp6cREghSwngjh7OzRezstKp0Ok/Q7XbvaHCpVJrP5XI4OPwGrS6lglSSiBQEkYVhOL4Eutwql8vmwFiAmMAfvX0ikKdxa/2uKWMsga7RdV34vp8oC4Ebi8tGXZ2o60b/04FmFgTSl/RAtHWv+4GyMOr6v0v37k92kPRKmcuaYHFp1aiPXKgJPbBHzIkDbZlIxEn9dgRf/UT6+wGezRxCvXqsxNMN/xzBKVj8bZwm2vq0gha7jedf1oCpLHBxgZTsqUe96gzFpiHQ1kbbqC2b8ckkz81lca1gwc24oPEAEcWx0Fd/2Zbztuo9+GEc6CmkUqmk7rMuIglOFfIhfWccKiTwkIPx2CmggCAILmgH79vtNgaDAfL5PDLZNG2gZYhiAvKQSjsmhwE1m+ngBAzJTEx7E2bsWq221u/3N5rN5v7e3i7SroWrVxZQLs9DDEmdaQIYIAJyEQmwIMBRNEAcxclbqNfr25S2G43Geq/Xe0mjXdJLJS6/AM9RbwIaJyP700TCpdlY3z4CCxmsSc955clnZSnznnDz967KOrC+Dp2wc104yh6mZJzlfwCf3q+o0qkR9wAAAABJRU5ErkJggg==" width="16" height="16" />';
	var clipimg = imgopentag+'iVBORw0KGgoAAAANSUhEUgAAAA8AAAANCAMAAABBwMRzAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAAC6UExURQAAAP///1CA0KCw0DBIYDBYsCBIkCBQoJCgsKCwwNDg8PD4/2CQ4HCg4JCowKCowLDA0LDA4LDA8LDI8ODo8PDw/yBAkICw4ICo8JCw8LC40K2+05Cw/8DQ8CBAgCBIoDBowGBwkEBwwGCAoFB4wGCI0HCQ0HCY0HCY4HCY8ICg4JCo4JC48KC44KS63qS+4qC48KDA8LfE2cDI0LDH6qDI/8DI4MDQ4LDQ/9DY4MDY/9DY8PDw8P/4/4mxF6cAAAABdFJOUwBA5thmAAAACXBIWXMAAA7DAAAOwwHHb6hkAAAAkklEQVQIHTXBBRbCMBAFwP0NqaTuiru7w/2vRXiBGQrDIKjYgf5CSNawpp8Aknfs16RUeNyEGUfRrixPRGQB7zSJIRW9LZGP8yp395DmMd+QB/uViDWa5ulwbpBp5647XQKwkzYzyEzF/XpZoJg5msa6ZLa+JkAq2pGlkzKGo0m+TsrIZoxZvpeRMuDcMHQ963wAbNUKbDa0+DQAAAAASUVORK5CYII=" width="15" height="13" />';
	var rejimg = imgopentag+'iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAALXSURBVDjLY/j//z8DJRhMmJQd+x89/W4IRQbY1x5L8590dzmy5PuIqC4gfvA+PPIyEMfhNqD06H+L9gfG9p33/jr23OMEiX30DTj8yT/oFxCf+hAYfBeIfwPxIyBWwjSg5Mh/tYZHzDr1D34aND7Y9tXOsf2Lg/O/z85uNjCFn908lT56eH985xXwzXvygwYUA4yLD/9Xcm+QlS572JWesP7XVyOL79/MLKci22Rc/6DXvPH+X8um+79t2u7/tOu4/w9ugFHxof8wha+1LP89NHT9iay5aNKKo9vXVvyzrz27/LuRqeo3Y7P/y6I7piMMKDoANuC3mNTSn5Iyv239dn3nSnwwiTfpIbN85tU9e9fk/Xt7e/X/29vCekDqfmrpHviurfcBboBB4b7/1QYB+n95Bf/94RNqY4h40MIQ/uA/U/iDv3ltc/69vr7k/+8vd/5fXx/4/tpaf1OwIYoqvxAG5O/9/5+R1f8/E9sdZKc75m7uvbgu4MeP11v+/3jW9//d3a3/Ly/z3HRpsTvrb3HpDXAD9PN2///JwBLym4FFHKbZb5aV99Ilbt/f3Fzz/8fjpv+HOoz//3q75v/5ec7/zs12DAa6VgpugF7uzv9zRDUc4DZ3GE3LmWT59f7e6v8/Xy36/+1O4v9D7Yb/vz8s///h3rb/p6ZYXTs50YIXboBu9vb/liU6khal2jPNS3Uf2ZTpvD04y/Hhe2DAfX9Q8v/rrQgIvh0L9MqE/w8PTvp/tMuoDmFA1rb/Rhma/oYZ6m7qAZaux6bbFTw81Pf/54vpYNu/3o4GesEITH+7l/X/2/ON/w8267462KitBTZAO3PLf+2Mzf+1MjYB8cb/O3pc/397c/f/z3d7//94BQyDV6uR8Nr/vz9f+f/kxJL/+6rVVmPNYUDnvTnSbvDtcKv+t0PNut+ANn07UK/5bX+txjegpm97K1W/7S1X/ranTOkwAORfnQagLb+TAAAAAElFTkSuQmCC" width="16" height="16" />';
	var vncimg = imgopentag+'iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAbpJREFUeNrUk8FKAlEUhu9oqRQ2JCG0UBgNWijWQkFhiAqaXERLceE21+16A1+gRQshCFy5MGiTCROBguEqzGkVI0kgumihOKQw3f4zOL2Aqw58MHPv+f9zzr0zAuecLRIOtmAsbCAgrIf5KGtgHyggBHzzvC+ggxp4AiNbZxsIMDh1u91niqJs5XI5v6Zpq41Gw0WbsizPIpHIpFQqDWu12vt0Oi1Cd0d1aQQPOE8kEhf1el2uVCrbpmmuBwIB12RiMAIiF63RHuVQLmksrdPpTKPq42AwmBqGwQlVVTlFsXjNZfmAK8oJR1fc3qdc0pB2CS7ZZDLpQ/uu2WxmzVUoFFDZZJeXV9Z7OBxln59vzN6nXNKgUJYMblqt1vpoNNr2IChBkiSmqk2WSh1ZAo/HzZaXpT+DbwQ0H6R1OhyOfrfb/Wk2m2Y8Ht8QRdGLeZmmvbJQaIeJog/VNXZ4uGcZ67rez+fz9ziLW7oVAXPYV5FEA8fpdDqayWSivV5vs91ue6liLBYbB4PBfrlc7lSr1Q4aeMDyM52TbWB/FysgAnaBH3jn62MwBC9AA4b97Qj//19Y2OBXgAEA3HnRUkre/J0AAAAASUVORK5CYII=" width="16" height="16" />';
	var knoppimg = imgopentag+'iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAIAAACQkWg2AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAfdEVYdFNvZnR3YXJlAFBhaW50Lk5FVCA/Pz8/Pz8gMy41LjXnygNhAAACDUlEQVQ4T5WSzW/ScBjH90d58bDFN6Z14WDc3YPRePWgJlOyJbKZuQRMIAFmXWnAdf11vCRAR5oVgSKGpN4gHhASJNISNpRSE17abg8rKXOHJXvSw5P0+3m+z/Nt506uWHPn9YZhNJvNAzYZj6GvAtfv9zVNuzBwBqiqSmxvejeW2JAtHbKFPlx/t3Lt/dvHh4fceWYKdLtd39bTTOh+AcFzO0/dK6DFDI353M8kSeI4DsxNbAIMh8OA5xVPL+WYO7Hgsnv9UcCzhvvWPe7VWu1nKsXmhUKlUpkB8SiVDNoF5gbC7fFoCHjz3WAwAHVfVTVdJwhiPB5PHHRd33I+ySOM38WC+Ka1LmCg7hwd//l7rOnjer1eKpUmAHBrL2/l9hfjnx5keN6a7XK5dggiEomQQRKGQuE4bjpor58vZBkMfVzOZrOy3Eol4rIsNRoNEIGCovYM3YDe7/fD6ZOjt72OL5SNDc87XtgdKzf3qB1TCgVZJxJJXTdGo1E4HJ6mVP0helfnC+jufgBLs5+tBBVFYRhGVf8BD8m22+0pAFttvHm4G1jIcJFW63exWOR5HrZHiOn1ejBekmQAZrFC9138lj5gWi0pGos0ftU6nSNFgf9CBzdgaBqZmU4dzA62dDqdOUHo9RSYelYn1WqVpmn4IFbc//18cGK5XEZnBduTJCmKonXSRQdrxuXNKVqJhuTKQRahAAAAAElFTkSuQmCC" width="16" height="16" />';
	var pillbimg = imgopentag+'iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAdRJREFUeNpi/P//PwMlgAVEeLAxgjn+/xiBmIFhdn09ujpVILb9+/ev0I8fP95++/bt1Js3b66uWLECYoAfUGPAP5yWmAGxU2ZmZjoXF5fU8+fPny5YsGD569evlwDFrzNBDMCvua6urp2bm1vh69evbEC+opeXVwSQbQxSwITHe3DNQCczfPnyheHTp08MQI0MvLy80q9eveLDZwBOzYyMjAyfP39+cvv27dcghYygWHjCxIRski8Qx0n+/RuCrhkEhISEGPT19TOBYjuAgfoA3QVgzVJz5oT8LSnBp/k4kPsA3Qu+wBQRD9L85+pVhs/v3jF8SUzEpfkiTBPYAGAk6P5mYEiUnjMnGKb53cuXDJ/evmVgy8nBqRmekH4xMCTJVlTY/bl1C0UzOysrg6isLMN1BYWdnxgZMTTDXfCdgUGWiZ1d4DNQI7rm0ytX7nn///9cbJrhLvjGwPDiw4MHnz69fCkI0szBwcEgIiXFsGfFikN/GBjmcjMwrMaVWJigBqy/tHHj5U9fvnzk5OX9y8TK+nnDihWnPjIwzPrLwLCCYGYCKtr7/P17lnuHD8cA2YrAQH0EFO4HZrHTyIrl5eUZLC0twYEKzAsM8IRECQAIMADDuAZJPVoHhAAAAABJRU5ErkJggg==" width="16" height="16" />';
	var pillsimg = imgopentag+'iVBORw0KGgoAAAANSUhEUgAAAAkAAAAJCAYAAADgkQYQAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAfdEVYdFNvZnR3YXJlAFBhaW50Lk5FVCA/Pz8/Pz8gMy41LjXnygNhAAAA30lEQVQoU2NgQAMNDQ2iQBxdU1NTUVhYGAUE/ChKgJJaQFzxHwh+/fr1f/fu3XsDAwPD4IqQFfz48eP/w4cP/1+/fv2/sbFxHljRU0ZGGyBeDTIBpuDChQv/nz179p+dnd0fpEAeiNf8X7Dg/4/cXLAJIAXPnz8HKUhnYmISZrjPyNjyf+5ciAJ///8XzM2RFaiArbrEyLjpZ2srXMGz4OD/exgZdwFNgCgAgUOMjN3XHB3vXXd3//8sKOj/EgaGwwsYGFxRvL2CgUFyLgPDtJkMDKemMTDMnsrAoIoedgDZ/4NOk+P2rwAAAABJRU5ErkJggg==" width="9" height="9" />';
	var mailimg = imgopentag+'iVBORw0KGgoAAAANSUhEUgAAABAAAAALCAIAAAD5gJpuAAAABGdBTUEAAK/INwWK6QAAAAlwSFlzAAAOwwAADsMBx2+oZAAAAB90RVh0U29mdHdhcmUAUGFpbnQuTkVUID8/Pz8/PyAzLjUuNefKA2EAAAHySURBVChTPZHfa9NQGIbzf6kIIopMWRVRZFMU0StBtwtBdKBstl271SvrLqaMIeg6GNNuFaUzLv2xtmsxWLfONkvXpVub5KRrlqbJSXJOPJ0yeC7f5/2+j4+ajm4E50rDU+y9V/m7ofyd0PqtidxgMHsjkLnuX7vqTV8eS/WPJq94mUHft9vPItRMjDMtpOoOdNxjLMf9h01AroNcrWtLB+bNQIx6+rZ42LXDSwLXhC0dl0XESYgHqKag+gFuqLhruTsSfBnZ/VNXPRMZ6lGYhTb6VFDDywIvQtXAx1FJw4blCgAGFnZfx9ugY/aE+6E8EYp76HO+55AyHbokqnQwtN09BU4uCu9W219KjqIdCQPeLBFKTfR7H82nlfEIRypJlByw34K+j9w0rfyoOIT/gmckRYQtEbE1GM3JH1JgKiZsNwy+abyJCe8TYC4lMWUzXT0SJjPUuceMaaNfAvz6E7A1c7OBVjY6M7Q4S4srxQ4Zm+WNxZycrJjgkKyUpU4+/K5DJ86CzTqsAlyVMS/jiow5GW9LuCKhrSYq7JjRdUmQNU9wjeobWmhpZh3obd1WDVsz7I5pkwpCFzoGweoBVKNQlgb8MYo879SDpRPD8dNP6DMjq2efM+dfMBdGE32+xEVf4pK/R/940uOnr40tk/BfI8umTjtY/sUAAAAASUVORK5CYII=" width="16" height="11" />';
	
	var mpimgsrc = '';
	var mpimgsrcbw = '';
	
	// кнопочки вверху (ввод логина, имени и пароля для сохранения в куках)
	var passimg = '\
		<div id=ujspassmenu>\
		 %img\
		 <div id=ujspasssubmenu>\
		  <span onclick="ujsMenuClick(this)">My BILLmanager name</span>\
		  <span onclick="ujsMenuClick(this)">My SSH login</span>\
		  <span onclick="ujsMenuClick(this)">Login/Password for VDSmanager</span>\
		  <span onclick="ujsMenuClick(this)">Login/Password for ISPserver DS</span>\
		  <span onclick="ujsMenuClick(this)">Login/Password for Knopp BILLmanager</span>\
		 </div><div class=ujsborderhider></div>\
		</div>';
	
	// собственно, ссылки на разные панели и протоколы
	var plain_mgrlnk = '<a target=_blank onclick="ujsDoPost(\'%i\'); return false;" href="#">'+plainimg+'</a>';
	var mgrlnk = '<a target=_blank onclick="ujsDoPost(\'%m\'); return false;" href="#">%i</a>';
	var suvdsmgrlnk = '<a target=_blank href="'+suvdsmgr+'">'+suvdsimg+'</a>';
	var suispmgrlnk = '<a target=_blank href="'+suispmgr+'">'+suispimg+'</a>';
	var suhispmgrlnk = '<a target=_blank href="'+suvdsmgr+'">'+suispimg+'</a>';
	var knopplnk = '<a target=_blank href="'+knoppbillmgr+'">'+knoppimg+'</a>';
	var sshlnk = '<a href="'+ssh+'">'+sshimg+'</a>';
	var sshvlnk = '<a href="'+ssh+'">'+sshvimg+'</a>';
	var cliplnk = '<a href="'+clip+'">'+clipimg+'</a>';
	var rejlnk = '<a href="#" onclick="ujsRej(%i); return false;">'+rejimg+'</a>';
	var vnclnk = '<a href="'+vnc+'">'+vncimg+'</a>';
	var pillulnk = '<a target=_blank href="https://msk1.ispserver.com/mancgi/sitesctl?user=%u">'+pillbimg+'</a>';
	var pillslnk = '<a target=_blank href="https://msk1.ispserver.com/mancgi/sitesctl?site=%u">'+pillsimg+'</a>';
	var maillnk = '<a target=_blank href="https://my.ispsystem.com/manager/billmgr?func=item.welcome&elid=%i&out=text">'+mailimg+'</a>';
	
	// другие ссылки
	var wikiknopp = '<a target=_blank href="http://wiki.ispsystem.net/index.php/Кнопп_(радиусхост),_регламент">regul</a>'
	var wikireglnk = '<a target=_blank href="http://wiki.ispsystem.net/index.php/Наши_регистраторы">regs</a>';
	var webnameslnk = '<a target=_blank href="https://www.webnames.ru/scripts/user_authorize.pl">webnames?</a>';
	var dnsbelnk = '<a target=_blank href="https://secure.registry.be/agent/Home.htm">dns.be?</a>';
	var directilnk = '<a target=_blank href="http://www.resellerclub.com/login/">directi?</a>';
	var wikiwdckvmlnk = '<a target=_blank href="http://wiki.ispsystem.net/index.php/WebDC#KVM">kvms</a>';
	var brukvmlnk = '<a target=_blank href="http://bru-kvm.ispsystem.net/auth.asp">kvm</a>';
	var wikissllnkraw = 'http://wiki.ispsystem.net/index.php/SSL_сертификаты#TheSSLStore.com';
	var wikissllnk = '<a target=_blank href="'+wikissllnkraw+'">ssls</a>';
	var wikimegaplanlnk = '<a target=_blank href="http://wiki.ispsystem.net/index.php/Мегаплан">man megaplan</a>';
	var wikibitrixlnk = '<a target=_blank href="http://wiki.ispsystem.net/index.php/Bitrix_SaaS_installation">man bitrix</a>'
	
	// всякие другие переменные
	var i;
	
	opera.addEventListener('BeforeEvent.DOMContentLoaded', function(e) {
		// создать вверху менюшку для ввода логинов-паролей
		var topel = $id('rTbl');
		if ( topel ) {
			topel = topel.getElementsByClassName('path-img')[1];
			if ( topel )
				topel.outerHTML = passimg.replace(/%img/g,topel.outerHTML);
		}
		topel = $id('ujspassmenu');
		if ( topel ) {
			var topelimg = topel.getElementsByTagName('IMG')[0];
			topelimg.addEventListener('click', ujsMenu, false);
		}
		
		if ( ! ujsCheckPage(Array('parent','title','tickets')) ) return;
		if ( !document.frm ) return;
		
		// выбрана услуга с кластера
		var isqcluster = false;
		
		var qcompany = '';
		var qclientname = '';
		var maintbl = $id('fpage_2');
		if ( maintbl ) {
			// узнаем компанию (если тикет от суперадмина - тут будет Super provider)
			qcompany = maintbl.getElementsByClassName('field-content')[3];
			qcompany = ( qcompany ) ? qcompany.innerText : '';
			
			// узнаем имя пользователя
			qclientname = maintbl.getElementsByClassName('field-content')[1];
			qclientname = ( qclientname ) ? qclientname.innerText : '';
		}
		
		// тема запроса
		var qsubject = ( document.frm.subject ) ? document.frm.subject.value : '';
		
		// узнаем id клиента (если тикет от суперадмина - тут будет 1)
		var qclient = ( document.frm.account ) ? document.frm.account.value : '';
		
		// узнаем id тикета
		qticket = ( document.frm.elid ) ? document.frm.elid.value : '';
		
		var btns = $id('buttonsDiv');
		if ( btns && qclient != 1 ) {
			// делаем кнопочку фильтра по клиенту
			var filterimg = document.createElement('IMG');
			filterimg.title = 'установить фильтр по клиенту';
			filterimg.src = 't-filterhappy.png';
			filterimg.onclick = function() {
				var params = {};
				params["elid"] = qticket;
				params["func"] = 'tickets.setfilter';
				ujsPostLocation(top.binary, params, "workarea");
				return false;
			}
			btns.appendChild(filterimg);
			
			// делаем кнопочку провалиться под клиента
			var intoimg = document.createElement('IMG');
			intoimg.title = 'перейти на уровень клиента';
			intoimg.src = 't-go.png';
			intoimg.onclick = function() {
				var params = {};
				params["elid"] = qticket;
				params["func"] = 'tickets.su';
				ujsPostLocation(top.binary, params, "workarea");
				return false;
			}
			btns.appendChild(intoimg);
		}
		
		// узнаем категорию вопроса и выбранный продукт
		maintbl = $class('field-tbl')[0];
		if ( !maintbl ) return;
		var selects = maintbl.getElementsByTagName('SELECT');
		for (i = 0; i < selects.length; i++) {
			if ( selects[i].name == 'product' )
				var qproduct = selects[i].options[selects[i].selectedIndex].value; // найти id что выбрано в select
			if ( selects[i].name == 'category' )
				var qcategory = selects[i].options[selects[i].selectedIndex].text; // найти значение что выбрано в select
		}
		
		// тикет от супер провайдера
		maintbl = $id('fpage_1');
		if ( maintbl && qclient == 1 ) {
			var tcell = maintbl.insertRow(maintbl.rows.length).insertCell(0);
			tcell.colSpan = 2;
			tcell.style.paddingTop = '10px';
			
			if ( qsubject.match(/certificate/) ) {
				// это заказ сертификата
				// вставляем красивый фрейм, чтобы не ходить лишний раз на вики
				var ifrm = document.createElement('IFRAME');
				ifrm.setAttribute('src', wikissllnkraw);
				ifrm.style.border = 0;
				ifrm.style.width = '100%';
				ifrm.style.height = '350px';
				tcell.appendChild(ifrm);
			} else
			if ( qsubject.match(/Открытие услуги/i) ) {
				// это заказ мегаплана (пока только мегаплан, потом может ещё что прикрутят)
				// вставляем ссылки на доки, т.к. для фрейма слишком маленькое окно, не удобно
				tcell.innerHTML = wikimegaplanlnk + '<br>' + wikibitrixlnk + '<br><br>' +
								  sshlnk.replace(/%s/g,vdsssh+'msk-48.ispsystem.net') + ' ' +
								  mgrlnk.replace(/%m/g,vdsmgr).replace(/%s/g,'msk-48.ispsystem.net').replace(/%i/g,'msk-48');
			}
		}
		
		// перебираем табличку с продуктами и услугами клиента
		var prtable = $class('productslist')[0];
		if ( !prtable ) return;
		var prrow = prtable.getElementsByTagName('TR');
		for (i = 1; i < prrow.length; i++) {
			
			// id (первый столбец)
			var prid = prrow[i].getElementsByClassName('productid')[0].innerText;
			var selected = ( prid == qproduct ) ? true : false;
			
			// описание (второй столбец)
			var prdescription = prrow[i].getElementsByClassName('productdescription')[0];
			// вычленяем ip
			var ip = prdescription.innerText.match(/\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}/);
			// вычленяем логин (или любой текст в скобках)
			var login = prdescription.innerText.match(/.*?\((.*?)\).*/);
			if ( login ) login = login[1];
			// строка для копирования - или ip, или в его отсутствие - логин, или все полностью
			var cb1 = ( ip ) ?
						ip :
						( ( login ) ?
							login :
							( ( /#/.test(prdescription.innerText) ) ?
								prid :
								prdescription.innerText.replace(/^\w*\s+-\s+/,'')
							)
						);
			
			// состояние (третий столбец)
			var prstate = prrow[i].getElementsByClassName('productstate')[0];
			var prstateimg = prstate.getElementsByTagName('IMG')[0];
			
			// папа (последний столбец)
			var prparent = prrow[i].getElementsByClassName('productparent')[0];
			// строка для копирования - просто все содержание столбца
			var cb2 = prparent.innerText;
			
			var srv, ssrv;
			
			// флажки для условий
			var isvdsparent = prparent.innerText.match(/((msk|bru|nyk)-\d{1,})\.ispsystem.net/);
			var isnsparent = prparent.innerText.match(/(dns)\.ispsystem.net/) ||
								( prdescription.innerText.match(/\sSlave NS/i) && prparent.innerText.match(/(nyk-srv)\.ispsystem.net/) );
			var isdsparent = !isnsparent && prparent.innerText.match(/((msk|msm|bru|nyk|wdc)-srv|ams-lw|nrb-het|nyk-nc)\.ispsystem.net/);
			var iswdcds = prparent.innerText.match(/wdc-srv/);
			var isbruds = prparent.innerText.match(/bru-srv/);
			var ishostparent = prparent.innerText.match(/(((msk|ny|bru)host-?\d?\.[^.]{6,})|(msk\d{1}\.ispserver)|(win-manager\.ispsystem))\.[a-z]+/);
			var isparent = isvdsparent || isdsparent || isnsparent || ishostparent;
			var islicense = !isparent && ip;
			var isbilllic = islicense && prdescription.innerText.match(/\sBILLmanager/i);
			var isisplic = islicense && prdescription.innerText.match(/\sISPmanager/i);
			var isvdslic = islicense && prdescription.innerText.match(/\sVDSmanager/i);
			var isdslic = islicense && prdescription.innerText.match(/\sDSmanager/i);
			var isdnslic = islicense && prdescription.innerText.match(/\sDNSmanager/i);
			var isiplic = islicense && prdescription.innerText.match(/\sIPmanager/i);
			var ismegaplan = prdescription.innerText.match(/Megaplan/i);
			var isxenvds = prdescription.innerText.match(/XEN/);
			var isrvds = prdescription.innerText.match(/RVDS\s/);
			var isknopp = !qcategory;
			var isreggi = qcategory && qcategory.match(/reggi/i);
			var isreggihost = prparent.innerText.match(/hostingpanel\.reggi\.ru/);
			//var isreggivds = isreggi && 0; // ни разу не видел ещё
			var iscluster = ( ishostparent && prparent.innerText.match(/msk1\.ispserver\.[a-z]+/) ) || isreggihost;
			var isispds = isdsparent && prdescription.innerText.match(/ISPserver\s/);
			var isfdds = isdsparent && prdescription.innerText.match(/FirstDEDIC\s/);
			var iscertificate = !isknopp && prdescription.innerText.match(/Certificates/i);
			var isdomain = !isknopp && !iscertificate &&
							( prdescription.innerText.match(/Domain names/i) ||
								(( !isparent && !ip && !iscertificate && !ismegaplan ) &&
									prdescription.innerText.match(/\.ru|\.su|\.be|\.com|\.net|\.org|\.biz|\.info|\.eu|\.de|\.li|\.ch|\.us|\.tv|\.fr/i))
							);
			var iswebnames = isdomain && prdescription.innerText.match(/\.ru|\.su|\.xn--p1ai/i);
			var isdnsbe = isdomain && prdescription.innerText.match(/\.be/i);
			var isdirecti = isdomain && !iswebnames && !isdnsbe;
			
			/* === условия для кнопочек === */
			
			if ( isparent ) {
				srv = isparent[0];
				ssrv = isparent[1];
			}
			if ( ishostparent || isnsparent || isreggihost )
				prdescription.innerHTML += ' ' +
										suhispmgrlnk.replace(/%i/g,prid) + ' ' +
										maillnk.replace(/%i/g,prid);
			
			if ( iscluster ) {
				var cluser = ( /^\d+$/.test(cb1) ) ? 'user'+cb1 : cb1;
				prdescription.innerHTML += ' ' + pillulnk.replace(/%u/g,cluser);
				if ( qproduct == prid ) isqcluster = true;
			}
			
			if ( isdsparent ) {
				prdescription.innerHTML += ' ' +
										plain_mgrlnk.replace(/%i/g,(isispds)?ispmgr:ispmgr_plain).replace(/%s/g,ip) + ' ' +
										suvdsmgrlnk.replace(/%i/g,prid);
				if ( isispds ) ip = 'ispserver@' + ip; else
				if ( isfdds ) ip = 'root@' + ip;
				prdescription.innerHTML += ' ' +
										maillnk.replace(/%i/g,prid) + ' ' +
										sshlnk.replace(/%s/g,ip+((isispds)?'|pass='+dsmgrpass:''));
				prparent.innerHTML = mgrlnk.replace(/%m/g,dsmgr_plain).replace(/%s/g,srv).replace(/%i/g,ssrv) + ' ' +
										sshlnk.replace(/%s/g,srv);
			}
			if ( ishostparent )
				prparent.innerHTML = mgrlnk.replace(/%m/g,ispmgr_plain).replace(/%s/g,srv).replace(/%i/g,ssrv) + ' ' +
										sshlnk.replace(/%s/g,'root@'+srv);
			
			if ( isreggihost )
				prparent.innerHTML += ' ' + sshlnk.replace(/%s/g,'root@'+isreggihost);
			
			if ( isnsparent )
				prparent.innerHTML = mgrlnk.replace(/%m/g,dnsmgr_plain).replace(/%s/g,srv).replace(/%i/g,ssrv) + ' ' +
										sshlnk.replace(/%s/g,'root@'+srv);
			
			if ( isvdsparent ) {
				if ( ip ) {
					prdescription.innerHTML += ' ' +
										suispmgrlnk.replace(/%i/g,prid) + ' ' +
										suvdsmgrlnk.replace(/%i/g,prid) + ' ' +
										( ( isxenvds ) ? '' : rejlnk.replace(/%i/g,"'"+srv+"','"+ip+"'") + ' ' ) +
										plain_mgrlnk.replace(/%i/g,ispmgr_plain).replace(/%s/g,ip) + ' ' +
										maillnk.replace(/%i/g,prid) + ' ' +
										sshvlnk.replace(/%s/g,vdsssh+srv+'|vds='+ip) +
										( ( isxenvds ) ? ' ' + vnclnk.replace(/%s/g,srv+'|'+ip+'|'+vdsssh.replace('@','')) : '' );
				} else if ( isrvds )
					prdescription.innerHTML += ' ' + suvdsmgrlnk.replace(/%i/g,prid);
				
				prparent.innerHTML = mgrlnk.replace(/%m/g,vdsmgr).replace(/%s/g,srv).replace(/%i/g,ssrv) + ' ' +
										sshlnk.replace(/%s/g,vdsssh+srv);
			}
			if ( islicense ) {
				if ( isbilllic ) prdescription.innerHTML += ' ' + plain_mgrlnk.replace(/%i/g,billmgr_plain).replace(/%s/g,ip);
				if ( isisplic ) prdescription.innerHTML += ' ' + plain_mgrlnk.replace(/%i/g,ispmgr_plain).replace(/%s/g,ip);
				if ( isvdslic ) prdescription.innerHTML += ' ' + plain_mgrlnk.replace(/%i/g,vdsmgr_plain).replace(/%s/g,ip);
				if ( isdslic ) prdescription.innerHTML += ' ' + plain_mgrlnk.replace(/%i/g,dsmgr_plain).replace(/%s/g,ip);
				if ( isdnslic ) prdescription.innerHTML += ' ' + plain_mgrlnk.replace(/%i/g,dnsmgr_plain).replace(/%s/g,ip);
				if ( isiplic ) prdescription.innerHTML += ' ' + plain_mgrlnk.replace(/%i/g,ipmgr_plain).replace(/%s/g,ip);
				
				prdescription.innerHTML += ' ' + sshlnk.replace(/%s/g,ip);
			}
			if ( ismegaplan ) {
				prdescription.innerHTML += ' ' +
										createDynamicButton('a'+prid, 'http://%s/', 'https://92.63.103.97/mancgi/megaplan?name='+qclientname, mpimgsrcbw, mpimgsrc) + ' ' +
										maillnk.replace(/%i/g,prid) + ' ' +
										sshvlnk.replace(/%s/g,vdsssh+'msk-48.ispsystem.net|vds='+qclientname) + ' ' +
										mgrlnk.replace(/%m/g,vdsmgr).replace(/%s/g,'msk-48.ispsystem.net').replace(/%i/g,'msk-48');
			}
			
			prdescription.innerHTML += ' ' + cliplnk.replace(/%s/g,cb1);
			if ( cb2 ) prparent.innerHTML += ' ' + cliplnk.replace(/%s/g,cb2);
			
			if ( isdomain ) prdescription.innerHTML += ' ' + wikireglnk;
			if ( iswebnames ) prdescription.innerHTML += ' ' + webnameslnk;
			if ( isdnsbe ) prdescription.innerHTML += ' ' + dnsbelnk;
			if ( isdirecti ) prdescription.innerHTML += ' ' + directilnk;
			if ( iswdcds ) prdescription.innerHTML += ' ' + wikiwdckvmlnk;
			if ( isbruds ) prdescription.innerHTML += ' ' + brukvmlnk;
			if ( iscertificate ) prdescription.innerHTML += ' ' + wikissllnk;
			if ( isknopp ) prparent.innerHTML += ' ' + knopplnk + ' ' + wikiknopp;
			if ( ismegaplan ) prdescription.innerHTML += ' ' + wikimegaplanlnk;
			
			if ( ( isparent || isrvds ) && prstateimg.src.match(/p-(off|on).png/) ) {
				prstateimg.style.cursor = 'pointer';
				prstateimg.params = {};
				prstateimg.params["elid"] = prid;
				prstateimg.params["func"] = '';
				prstateimg.q = ' услугу ' + prid + ' - ' + (login || cb1) + ' ?';
				
				if ( isvdsparent ) prstateimg.params["func"] = 'vds.'; else
				if ( isnsparent ) prstateimg.params["func"] = 'dns.'; else
				if ( ishostparent ) prstateimg.params["func"] = 'vhost.'; else
				if ( isrvds ) prstateimg.params["func"] = 'rvds.'; else
				if ( isdsparent ) prstateimg.params["func"] = 'dedic.';
				
				if ( prstateimg.src.match(/p-off.png/) ) {
					prstateimg.q = 'Запустить' + prstateimg.q;
					prstateimg.params["func"] += 'enable';
				} else
				if ( prstateimg.src.match(/p-on.png/) ) {
					prstateimg.q = 'Остановить' + prstateimg.q;
					prstateimg.params["func"] += 'disable';
				}
				prstateimg.onclick = function() {
					if ( confirm(this.q) )
						ujsPostLocation(top.binary, this.params, "workarea");
				}
			}
			
			/* === end условия для кнопочек === */
			
		} // конец for по всем строкам таблицы услуг
		
		// подсвечиваем все ссылки в тикете
		var thistory = $id('htmldata-hist')
		if ( thistory ) {
			thistory = thistory.getElementsByClassName('support-body');
			for (i = 0; i < thistory.length; i++)
										// скобочные группы            1                 3                                                                 8                                                                                                                                                                                                                                                                                                                                                                 
				thistory[i].innerHTML = thistory[i].innerHTML.replace(/((?:[\w]+:)?\/\/)?((?:(?:[\d\w\.-]|%[a-f\d]{2,2})+(?::(?:[\d\w]|%[a-f\d]{2,2})+)?@)?((?:[\d\wа-яё][-\.\d\wа-яё]{0,253}[\d\wа-яё]\.)+(?:aero|asia|at|be|bg|biz|by|cc|ch|cn|com|cz|de|dk|eu|fm|fr|info|in|it|kg|kz|li|lt|lv|me|mobi|name|net|nf|nl|org|pro|ru|se|shop|su|tk|tv|ua|uk|us|ws|рф|xn--p1ai|\d{1,3})))(?::[\d]+)?(?:\/(?:[-+_~:;\d\wа-яё\(\)]|[,.](?![\s<])|%[a-f\d]{2,2})*)*(?:\?(?![\s<])(?:&?(?:[-+_~:;\d\wа-яё\(\)]|[,.](?![\s<])|%[a-f\d]{2,2})=?)*)?(?:#(?:[-+_~:;\d\wа-яё\(\)]|[,.](?![\s<])|%[a-f\d]{2,2})*)?(?![\wа-яё])/ig,
					// функция замены, если прошлый регексп нашел совпадение
					function(str, p1,p3,p8, offset, s) {
						var B = s.substring(offset-100,offset); // before
						var A = s.substr(offset+str.length, 100); // after
						
						if ( //A.match(/^[\wа-я]/i) || // сразу за ссылкой идет буква // условие сделал в самой регулярке
							 B.match(/[\/\\]$/) || // перед ссылкой какой-нить слеш
							 ( B.match(/<a.*?$/i) && A.match(/^.*?<\/a>/i) ) // внутри тегов <a>
						   ) return str;
						
						var proto = p1; // протокол ( http:// | ftp:// | https:// и т.д. или null )
						var email = ( p3.match(/@/) ) ? p3 : null; // адрес email
						var domain = p8; // сам домен
						var ip = domain.match(/\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}/); // если это ip
						var baddomain = domain.match(/\.\d+$/); // если фигня всякая, типа номеров версий, которая случайно попалась под регулярку
						// пилюли у сайтов, если это кластер
						var pl = ( isqcluster ) ? ' ' + pillslnk.replace(/%u/g, domain) : '';
						
						// преобразуем все урлы в ссылки
						if ( email )
							return '<a class="ticket clip" href="clip:'+str+'" onclick="ujsTicketA(this,\''+domain+'\', \'clip\');">'+str+'</a>' + pl;
						if ( ip && !proto )
							return str.replace(/(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})/, '<a class="ticket clip" href="clip:$1" onclick="ujsTicketA(this);">$1</a>');
						if ( baddomain && !proto )
							return str;
						return '<a class=ticket target=_blank href="'+((proto)?'':'http://')+str+'" onclick="ujsTicketA(this,\''+domain+'\',\'clip\');">'+str+'</a>' + pl;
					});
		}
		// конец подсветки
		
		//alert(ujsPunyCoder.ToUnicode('xn--90ajekucos.xn--p1ai'));
		//alert(punycode.ToUnicode('buckethead.ru'));
		//alert('xn--90ajekucos.xn--p1ai');
		
	}, true); // конец opera.addEventListener 'BeforeEvent.DOMContentLoaded'
	
})();
